/**
 * 一题答案
 * 执行结果：10
 * 解析： var定义的循环变量i，属于全局作用域，在10次循环执行之后，i的值就是10，即全局的i是10，无论运行数组a的第几项，其执行结果都是10
 */

 /**
  * 二题答案
  * 执行结果： 会抛出引用错误，提示在变量定义之前不能使用；
  * 解析： 
  */

  /**
  * 三题答案
  */
 var arr = [12,34,32,89,4]
 arr.sort((a, b) => a-b)[0]

  /**
  * 四题答案
  * 通过var定义的变量，会变量提升，未经定义也可以使用，值是undefined, 并且可以反复修改，后面的值会覆盖前面的;
  * 通过let定义的变量，会形成一个“小的局部作用域” ，也就是“块作用域”，即包裹let，且距离let最近的第一对花括号{}所组成的区域,
  *     未经定义，不能使用，否则会报错;
  * 通过const定义的变量，如果是基本类型，一旦定义，值是不能被修改的，通常用来定义常量；同时也会形成一个“小的局部作用域” ，
  *     也就是“块作用域”，即包裹const，且距离const最近的第一对花括号{}所组成的区域；未经定义，
  *     不能使用，否则会报错;
  */

/**
* 五题答案
*/
var a = 10
var obj = {
    a: 20,
    fn () {
        setTimeout(() => {
            console.log(this.a)
        })
    }
}

obj.fn()


/**
 * 六题答案
 * 1: 使用symbol作为对象属性名，使用symbol类型定义的key是不能被Object.keys()以及for...in来枚举的，
 *    例如，使用JSON.stringfy()转化对象的时候，以symbol类型定义的属性，会被排除在外，这样就使得对象的“对内操作”和“对外输出”更加优雅整洁；
 * 2: 使用symbol来替代常量；
 * 3: 使用symbol定义类的私有属性和方法；
*/

/**
 * 七题答案
 *  浅拷贝和深拷贝，应该是针对较为复杂的引用类型来说的，基本类型的数据，名字和值都在栈内存中，无所谓深拷贝或者浅拷贝；
 *  引用类型的名字存在占内存，值在堆内存，但是栈内存会提供一个引用地址，指向对应的堆内存中的值，如果是浅拷贝，也就是只拷贝这个引用地址，而不会把堆内存的值复制一份；
 *  深拷贝的实现方式：
 *  1: 采用递归的方式，一层一层复制深层级的对象；
 *  2: 通过JSON对象的转换来实现深拷贝；
 *  3: 通过jQuery的extend方法实现深拷贝;
 *  4: lodash函数库实现深拷贝；
 *  5: 用slice或者concat实现对数组的深拷贝；
 *  6: Object.create()
*/
// 1: 采用递归的方式；
// 2: 通过JSON对象的转换来实现深拷贝；
function deepClone(obj) {
    const _obj = JSON.stringify(obj);
    return JSON.parse(_obj)
}

// 3: 通过jQuery的extend方法实现深拷贝;
const arr = [1,3,2];
const newArr = $.extend(true, [], arr); // true 深拷贝 false浅拷贝

// 4: lodash函数库实现深拷贝；
function deepClone2(obj) {
    return _.cloneDeep(obj)
}

/**
 * 八题答案
 * ES是JS的规范；JS是ES的扩展
*/

/**
 * 九题答案
 * 优点：
 * 1: TS可以定义从简单到复杂几乎一切类型，语义化十分明显；
 * 2: TS编辑阶段报错，对于开发者老说，可以避免一些不必要的bug；并且即使编译报错，也会生成相应的js文件；
 * 3: TS即使不显示定义类型，也会自动进行类型推断；
 * 4: TS兼容第三方库；
 * 缺点：
 * 1: 学习成本高，需要理解Interfaces、Generics、Classes、Enums等前端不太常见的这些概念；
 * 2: 短期的项目会增加开发成本，集成、构建都需要一定的工作量
*/

/**
 * 十题答案
 * 工作原理：
 * 引用计数用来记录当前有多少指针指向同一块动态分配的内存。
 * 当有指针指向这块内存时，计数器加1；当指向此内存的指针销毁时，计数器减1。当引用计数为0时，表示此块内存没有被任何指针指向，此块被共享的动态内存才能被释放。
 * 优点：
 * 1: 发现垃圾时立即回收
 * 2: 最大限度减少程序暂停
 * 缺点：
 * 1: 无法回收循环引用的对象
 * 2: 时间开销大
*/

/**
 * 十一题答案
 * 标记整理算法的工作流程（可以看作是标记清除算法的增强）
 * 1：遍历所有对象，标记活动对象
 * 2：整理，移动活动对象位置，使活动对象连续起来
 * 3：执行清除操作，清除掉所有未标记对象
*/

/**
 * 十二题答案
 * V8将内存空间一分为2，小空间存放新生代对象，大空间存放老生代；
 * 小空间又被分为等大的from和to两个空间，活动对象都在from
 * 标记整理将活动对象copy到To，From与To交换空间，完成空间释放
 * copy过程中，可能触发晋升操作，将新生代晋升至老生代
 * 一轮GC之后还存活的新生代需要晋升，To空间的使用率超过25% 需要晋升
*/

/**
 * 十三题答案
 * 在何时使用？工作原理
 * V8老生代存储区的内存释放时候，可以用增量标记算法优化垃圾回收的操作；
 * 原理：程序运行，与垃圾回收，分段穿插进行，而不是等程序一口气运行完，再一次性清理；
*/















